home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / MACROS.SA < prev    next >
Text File  |  1987-03-04  |  20KB  |  1,278 lines

  1.  PAGE
  2. *
  3. **************************************************************
  4. *
  5. *
  6. *     G L O B A L   M A C R O S
  7. *
  8. *
  9. **************************************************************
  10. *
  11. ****************
  12. *
  13. * SRD
  14. *   MACRO TO LOGICAL DOUBLE SHIFT D-REG N BITS RIGHT. (1 <= N <= 8)
  15. *
  16. *   CALL:  SRD N
  17. *
  18. SRD MACR
  19.  IFGT (\0)-8 LOOK FOR ILLEGAL CASES
  20.  FAIL *** SRD N; N <= 8 ***
  21.  ENDC
  22.  IFLT (\0)-1
  23.  FAIL *** SRD N; N >= 0 ***
  24.  ENDC
  25. * N IS OKAY; DO THE SHIFTS
  26.  IFEQ (\0)-8
  27.  LSRA
  28.  RORB
  29.  ENDC
  30.  IFGE (\0)-7
  31.  LSRA
  32.  RORB
  33.  ENDC
  34.  IFGE (\0)-6
  35.  LSRA
  36.  RORB
  37.  ENDC
  38.  IFGE (\0)-5
  39.  LSRA
  40.  RORB
  41.  ENDC
  42.  IFGE (\0)-4
  43.  LSRA
  44.  RORB
  45.  ENDC
  46.  IFGE (\0)-3
  47.  LSRA
  48.  RORB
  49.  ENDC
  50.  IFGE (\0)-2
  51.  LSRA
  52.  RORB
  53.  ENDC
  54.  IFGE (\0)-1
  55.  LSRA
  56.  RORB
  57.  ENDC
  58.  ENDM
  59.  PAGE
  60. *
  61. *****************
  62. *
  63. * SLD N
  64. *   MACRO TO LOGICALLY SHIFT D-REG N BITS OO
  65. *   THE LEFT. (1 <= N <= 8)
  66. *
  67. *   CALL: SLD N
  68. *
  69. *****************
  70. *
  71. SLD MACR
  72. * CATCH THE ILLEGAL CASES
  73.  IFGT (\0)-8
  74.  FAIL *** SSLD N; N <= 8 ***
  75.  ENDC
  76.  IFLT (\0)-1
  77.  FAIL *** SLD N; N >= 0 ***
  78.  ENDC
  79.  IFEQ (\0)-8
  80.  LSLB
  81.  ROLA
  82.  ENDC
  83.  IFGE (\0)-7
  84.  LSLB
  85.  ROLA
  86.  ENDC
  87.  IFGE (\0)-6
  88.  LSLB
  89.  ROLA
  90.  ENDC
  91.  IFGE (\0)-5
  92.  LSLB
  93.  ROLA
  94.  ENDC
  95.  IFGE (\0)-4
  96.  LSLB
  97.  ROLA
  98.  ENDC
  99.  IFGE (\0)-3
  100.  LSLB
  101.  ROLA
  102.  ENDC
  103.  IFGE (\0)-2
  104.  LSLB
  105.  ROLA
  106.  ENDC
  107.  IFGE (\0)-1
  108.  LSLB
  109.  ROLA
  110.  ENDC
  111.  ENDM
  112.  PAGE
  113. *
  114. *****************
  115. *
  116. * MOVE MACROS
  117. *   THIS SET OF MACROS MOVES A SOURCE OPERAND TO
  118. *   A DESTINATION OPERAND USING THE SPECIFIED
  119. *   REGISTER AS INTERMEDIATE.
  120. *
  121. *   MOV<A|B|D|X|Y|U|S> <SOURCE>,<DEST>
  122. *
  123. *****************
  124. *
  125. MOVD MACR
  126.      LDD \0
  127.      STD \1
  128.      ENDM
  129. *
  130. MOVA MACR
  131.      LDA \0
  132.      STA \1
  133.      ENDM
  134. *
  135. MOVB MACR
  136.      LDB \0
  137.      STB \1
  138.      ENDM
  139. *
  140. MOVX MACR
  141.      LDX \0
  142.      STX \1
  143.      ENDM
  144. *
  145. MOVY MACR
  146.      LDY \0
  147.      STY \1
  148.      ENDM
  149. *
  150. MOVU MACR
  151.      LDU \0
  152.      STU \1
  153.      ENDM
  154. *
  155. MOVS MACR
  156.      LDS \0
  157.      STS \1
  158.      ENDM
  159.  PAGE
  160. *
  161. **********************************************
  162. *
  163. * BIT MANIPULATION MACROS
  164. *   BSET  SET A BIT IN MEMORY
  165. *   BCLR  CLEAR A BIT IN MEMORY
  166. *
  167. *   SET OR CLEAR A BIT IN MEMORY. THE FORMAT
  168. *   OF THE CALL IS:
  169. *    BSET<A|B> <BIT#>,<MEMORY LOCATION>
  170. *    BCLR<A|B> <BIT#>,<MEMORY LOCATION>
  171. *
  172. *    THE A OR B REGISTER MUST BE SPECIFIED AND IT
  173. *    PROVIDES THE INTERMEDIATE SCRATCH REGISTER.
  174. *
  175. *    THE BIT NUMBER CAN BE ONE OR MORE BITS
  176. *
  177. **********************
  178. *
  179. BSETA MACR
  180.       LDA \1
  181.       ORA #(\0)
  182.       STA \1
  183.       ENDM
  184. *
  185. BSETB MACR
  186.       LDB \1
  187.       ORB #(\0)
  188.       STB \1
  189.       ENDM
  190. *
  191. BCLRA MACR
  192.       LDA \1
  193.       ANDA #(-(\0)-1)!.$FF
  194.       STA \1
  195.       ENDM
  196. *
  197. BCLRB MACR
  198.       LDB \1
  199.       ANDB  ((-(\0)-1)!.$FF
  200.       STB \1
  201.       ENDM
  202.  PAGE
  203. *
  204. ***********************************************
  205. *
  206. *  INCREMENT AND DECREMENT 16 BIT REGISTESS
  207. *
  208. ***********************************************
  209. *
  210. INCX MACR
  211.  LEAX 1,X
  212.  ENDM
  213. *
  214. DECX MACR
  215.  LEAX -1,X
  216.  ENDM
  217. *
  218. INCY MACR
  219.  LEAY 1,Y
  220.  ENDM
  221. *
  222. DECY MACR
  223.  LEAY -1,Y
  224.  ENDM
  225. *
  226. INCU MACR
  227.  LEAU 1,U
  228.  ENDM
  229. *
  230. DECU MACR
  231.  LEAU -1,U
  232.  ENDM
  233. *
  234. INCS MACR
  235.  LEAS 1,S
  236.  ENDM
  237. *
  238. DECS MACR
  239.  LEAS -1,S
  240.  ENDM
  241. *
  242. INCD MACR
  243.  INCB
  244.  BNE *+3
  245.  INCA
  246.  ENDM
  247. *
  248. DECD MACR
  249.  TSTB
  250.  BNE \.1
  251.  DECA
  252. \.1 DECB
  253.  ENDM
  254. *
  255.  
  256.  PAGE
  257. *
  258. ******************
  259. *
  260. *  IOP N
  261. *
  262. *    MACRO TO SET INVALID OPERATION STATUS BITS IN
  263. *    THE TEMPORARY STATUS BYTES ON THE STACK FRAME
  264. *    SETS IOP BIT AND INVALID OPERATION CODE.
  265. *
  266. *  CALL: IOP N
  267. *    WHERE N IS A VALID INVALID OPERATION NUMBER
  268. *   USES A REGISTER
  269. *
  270. * USES A-REGISTER
  271. *
  272. *****************
  273. *
  274. IOP MACR
  275. * CHECK FOR ILLEGAL CASES
  276.  IFLT (\0)-1
  277.  FAIL *** IOP N; N > 0 ***
  278.  ENDC
  279.  IFGT (\0)-BIGIOP
  280.  FAIL *** IOP N; N TOO BIG ***
  281.  ENDC
  282. * NOT ILLEGAL
  283.  LDA #(\0)
  284.  LBSR  IOPSUB        SET IOP CODE,IOP BIT & RETURN A NAN
  285.  ENDM
  286.  PAGE
  287. ***********************************************************************
  288. *
  289. *    STRUCTURED MACROS FOR ASSEMBLY LANGUAGE PROGRAMMING THE 6809
  290. *    BY JOEL BONEY
  291. *       GREG WALKER
  292. *
  293. EXBUG EQU $F000
  294. STKTOP SET 0
  295. ISLONG SET 0
  296. PUSH MACR
  297. ***********************************************************************
  298. *
  299. *    PUSH --
  300. *        THIS MACRO SIMULATES A 7-LEVEL STACK USING SEVEN SYMBOLS
  301. *    WHOSE VALUES ARE REDEFINED TO BE THE VALUES ON THE STACK. THE
  302. *    SYMBOL "STKTOP" CONTAINS A NUMBER FROM 0 TO 7 WHICH INDICATES
  303. *    THE SYMBOL (S1 TO S7) THAT CONTAINS THE VALUE ON THE TOP OF THE
  304. *    STACK. A VALUE OF ZERO FOR STKTOP INDICATES THAT THE STACK IS
  305. *    EMPTY.
  306. *
  307. STKTOP SET STKTOP+1
  308.  IFEQ STKTOP-1
  309. S1 SET \0
  310. L1 SET ISLONG
  311.  EXIT
  312.  ENDC
  313.  IFEQ    STKTOP-2
  314. S2 SET      \0
  315. L2 SET ISLONG
  316.  EXIT
  317.  ENDC
  318.  IFEQ  STKTOP-3
  319. S3 SET \0
  320. L3 SET ISLONG
  321.  EXIT
  322.  ENDC
  323.  IFEQ STKTOP-4
  324. S4 SET \0
  325. L4 SET ISLONG
  326.  EXIT
  327.  ENDC
  328.  IFEQ STKTOP-5
  329. S5 SET \0
  330. L5 SET ISLONG
  331.  EXIT
  332.  ENDC
  333.  IFEQ STKTOP-6
  334. S6 SET \0
  335. L6 SET ISLONG
  336.  EXIT
  337.  ENDC
  338.  IFEQ STKTOP-7
  339. S7 SET \0
  340. L7 SET ISLONG
  341.  EXIT
  342.  ENDC
  343.  IFEQ STKTOP-8
  344. S8 SET \0
  345. L8 SET ISLONG
  346.  EXIT
  347.  ENDC
  348.  IFEQ STKTOP-9
  349. S9 SET \0
  350. L9 SET ISLONG
  351.  EXIT
  352.  ENDC
  353.  IFEQ STKTOP-10
  354. S10 SET \0
  355. L10 SET ISLONG
  356.  EXIT
  357.  ENDC
  358.  IFGT STKTOP-10
  359.  FAIL ** SYMBOL STACK OVERFLOW **
  360.  ENDC
  361.  ENDM
  362. POP MACR
  363. ***********************************************************************
  364. *
  365. *    POP --
  366. *        THE POP MACRO REMOVES THE TOPMOST ELEMENT FROM THE
  367. *    SIMULATED STACK.
  368. *
  369.  IFLE STKTOP
  370.  FAIL ** SYMBOL STACK UNDERFLOW **
  371.  ENDC
  372.  IFGT STKTOP
  373. STKTOP SET STKTOP-1
  374.  ENDC
  375.  ENDM
  376. BACK1 MACR
  377. ************************************************************************
  378. *
  379. *    BACK1    --
  380. *        THIS MACRO SETS THE ASSEMBLER'S LOCATION COUNTER TO
  381. *    THE VALUE ON THE TOP OF THE STACK. CODE GENERATED AFTER THIS
  382. *    MACRO IS CALLED WILL BE LOCATED AT THE ADDRESS CONTAINED ON
  383. *    THE TOP OF THE SYMBOL STACK.
  384. *        THE CONTENTS OF THE STACK ARE NOT CHANGED BY THIS
  385. *    MACRO.
  386. *
  387.  IFEQ STKTOP-1
  388.  ORG S1
  389. BCKLNG SET L1
  390.  EXIT
  391.  ENDC
  392.  IFEQ STKTOP-2
  393.  ORG S2
  394. BCKLNG SET L2
  395.  EXIT
  396.  ENDC
  397.  IFEQ STKTOP-3
  398.  ORG S3
  399. BCKLNG SET L3
  400.  EXIT
  401.  ENDC
  402.  IFEQ STKTOP-4
  403.  ORG S4
  404. BCKLNG SET L4
  405.  EXIT
  406.  ENDC
  407.  IFEQ STKTOP-5
  408.  ORG S5
  409. BCKLNG SET L5
  410.  EXIT
  411.  ENDC
  412.  IFEQ STKTOP-6
  413.  ORG S6
  414. BCKLNG SET L6
  415.  EXIT
  416.  ENDC
  417.  IFEQ STKTOP-7
  418.  ORG S7
  419. BCKLNG SET L7
  420.  EXIT
  421.  ENDC
  422.  IFEQ STKTOP-8
  423.  ORG S8
  424. BCKLNG SET L8
  425.  EXIT
  426.  ENDC
  427.  IFEQ STKTOP-9
  428.  ORG S9
  429. BCKLNG SET L9
  430.  EXIT
  431.  ENDC
  432.  IFEQ STKTOP-10
  433.  ORG S10
  434. BCKLNG SET S10
  435.  EXIT
  436.  ENDC
  437.  IFLE STKTOP
  438.  FAIL ** REFERENCE WAS MADE TO EMPTY SYMBOL STACK **
  439.  EXIT
  440.  ENDC
  441.  IFGT STKTOP-7
  442.  FAIL ** STACK TOP POINTER EXCEEDS STACK **
  443.  EXIT
  444.  ENDC
  445.  ENDM
  446. RELOP MACR
  447. **********************************************************************
  448. *
  449. *    RELOP --
  450. *        THIS MACRO CREATES A RELATIVE BRANCH INSTRUCTION
  451. *    FOR THE 'IF', 'WHILE', AND 'UNTIL' MACROS BASED ON THE
  452. *    RELATIONAL OPERATOR PASSED TO IT AS ITS FIRST ARGUMENT.
  453. *
  454.  IFC \0,EQ
  455.   IFEQ ISLONG
  456.   BNE *
  457.   EXIT
  458.   ENDC
  459.   IFEQ ISLONG-1
  460.   LBNE EXBUG
  461.   EXIT
  462.   ENDC
  463.  ENDC
  464.  IFC \0,NE
  465.   IFEQ ISLONG
  466.   BEQ *
  467.   EXIT
  468.   ENDC
  469.   IFEQ ISLONG-1
  470.   LBEQ EXBUG
  471.   EXIT
  472.   ENDC
  473.  ENDC
  474.  IFC \0,LE
  475.   IFEQ ISLONG
  476.   BGT *
  477.   EXIT
  478.   ENDC
  479.   IFEQ ISLONG-1
  480.   LBGT EXBUG
  481.   EXIT
  482.   ENDC
  483.  ENDC
  484.  IFC \0,LT
  485.   IFEQ ISLONG
  486.   BGE *
  487.   EXIT
  488.   ENDC
  489.   IFEQ ISLONG-1
  490.   LBGE EXBUG
  491.   EXIT
  492.   ENDC
  493.  ENDC
  494.  IFC \0,GE
  495.   IFEQ ISLONG
  496.   BLT *
  497.   EXIT
  498.   ENDC
  499.   IFEQ ISLONG-1
  500.   LBLT EXBUG
  501.   EXIT
  502.   ENDC
  503.  ENDC
  504.  IFC \0,GT
  505.   IFEQ ISLONG
  506.   BLE *
  507.   EXIT
  508.   ENDC
  509.   IFEQ ISLONG-1
  510.   LBLE EXBUG
  511.   EXIT
  512.   ENDC
  513.  ENDC
  514.  IFNC \0,EQ
  515.   IFNC \0,NE
  516.    IFNC \0,LT
  517.     IFNC \0,LE
  518.      IFNC \0,GE
  519.       IFNC \0,GT
  520.       FAIL ** INVALID RELATIONAL OPERATOR -- \0 **
  521.       EXIT
  522.       ENDC
  523.      ENDC
  524.     ENDC
  525.    ENDC
  526.   ENDC
  527.  ENDC
  528.  ENDM
  529. RELTST MACR
  530. *****************************************************************
  531. *
  532. *      RELTST --
  533. *         THE 'RELTST' MACRO TESTS THE VALIDITY OF THE
  534. *      RELATIONAL OPERATOR USED WITH THE 'IFTST' MACRO AND
  535. *      GENERATES THE PROPER RELATIVE BRANCH INSTRUCTION.
  536. *
  537.  IFC \0,EQ
  538.   IFEQ ISLONG
  539.   BNE *
  540.   EXIT
  541.   ENDC
  542.   IFEQ ISLONG-1
  543.   LBNE EXBUG
  544.   EXIT
  545.   ENDC
  546.  ENDC
  547.  IFC \0,NE
  548.   IFEQ ISLONG
  549.   BEQ *
  550.   EXIT
  551.   ENDC
  552.   IFEQ ISLONG-1
  553.   LBEQ EXBUG
  554.   EXIT
  555.   ENDC
  556.  ENDC
  557.  IFC \0,GE
  558.   IFEQ ISLONG
  559.   BLT *
  560.   EXIT
  561.   ENDC
  562.   IFEQ ISLONG-1
  563.   LBLT EXBUG
  564.   EXIT
  565.   ENDC
  566.  ENDC
  567.  IFC \0,LT
  568.   IFEQ ISLONG
  569.   BGE *
  570.   EXIT
  571.   ENDC
  572.   IFEQ ISLONG-1
  573.   LBGE EXBUG
  574.   EXIT
  575.   ENDC
  576.  ENDC
  577.  IFNC \0,EQ
  578.   IFNC \0,NE
  579.    IFNC \0,GE
  580.     IFNC \0,LT
  581.     FAIL ** \0 IS AN INVALID RELATIONAL OPERATOR FOR 'IFTST' **
  582.     EXIT
  583.     ENDC
  584.    ENDC
  585.   ENDC
  586.  ENDC
  587.  ENDM
  588. RELCC MACR
  589. **********************************************************************
  590. *
  591. *      RELCC --
  592. *         THE 'RELCC' MACRO TESTS THE VALIDITY OF THE RELATIONAL
  593. *      OPERATOR FOR THE 'IFCC' MACRO AND GENERATES THE PROPER RELATIVE
  594. *      BRANCH INSTRUCTION.
  595. *
  596.  IFC \0,EQ
  597.   IFEQ ISLONG
  598.   BNE *
  599.   EXIT
  600.   ENDC
  601.   IFEQ ISLONG-1
  602.   LBNE EXBUG
  603.   EXIT
  604.   ENDC
  605.  ENDC
  606.  IFC \0,NE
  607.   IFEQ ISLONG
  608.   BEQ *
  609.   EXIT
  610.   ENDC
  611.   IFEQ ISLONG-1
  612.   LBEQ EXBUG
  613.   EXIT
  614.   ENDC
  615.  ENDC
  616.  IFC \0,LE
  617.   IFEQ ISLONG
  618.   BGT *
  619.   EXIT
  620.   ENDC
  621.   IFEQ ISLONG-1
  622.   LBGT EXBUG
  623.   EXIT
  624.   ENDC
  625.  ENDC
  626.  IFC \0,LT
  627.   IFEQ ISLONG
  628.   BGE *
  629.   EXIT
  630.   ENDC
  631.   IFEQ ISLONG-1
  632.   LBGE EXBUG
  633.   EXIT
  634.   ENDC
  635.  ENDC
  636.  IFC \0,GE
  637.   IFEQ ISLONG
  638.   BLT *
  639.   EXIT
  640.   ENDC
  641.   IFEQ ISLONG-1
  642.   LBLT EXBUG
  643.   EXIT
  644.   ENDC
  645.  ENDC
  646.  IFC \0,GT
  647.   IFEQ ISLONG
  648.   BLE *
  649.   EXIT
  650.   ENDC
  651.   IFEQ ISLONG-1
  652.   LBLE EXBUG
  653.   EXIT
  654.   ENDC
  655.  ENDC
  656.  IFC \0,CC
  657.   IFEQ ISLONG
  658.   BCS *
  659.   EXIT
  660.   ENDC
  661.   IFEQ ISLONG-1
  662.   LBCS EXBUG
  663.   EXIT
  664.   ENDC
  665.  ENDC
  666.  IFC \0,CS
  667.   IFEQ ISLONG
  668.   BCC *
  669.   EXIT
  670.   ENDC
  671.   IFEQ ISLONG-1
  672.   LBCC EXBUG
  673.   EXIT
  674.   ENDC
  675.  ENDC
  676.  IFC \0,VC
  677.   IFEQ ISLONG
  678.   BVS *
  679.   EXIT
  680.   ENDC
  681.   IFEQ ISLONG-1
  682.   LBVS EXBUG
  683.   EXIT
  684.   ENDC
  685.  ENDC
  686.  IFC \0,VS
  687.   IFEQ ISLONG
  688.   BVC *
  689.   EXIT
  690.   ENDC
  691.   IFEQ ISLONG-1
  692.   LBVC EXBUG
  693.   EXIT
  694.   ENDC
  695.  ENDC
  696.  IFNC \0,EQ
  697.   IFNC \0,NE
  698.    IFNC \0,LT
  699.     IFNC \0,LE
  700.      IFNC \0,GE
  701.       IFNC \0,GT
  702. RELERR SET 1   ERROR FLAG FOR NEXT SET OF TESTS
  703.       ENDC
  704.      ENDC
  705.     ENDC
  706.    ENDC
  707.   ENDC
  708.  ENDC
  709.  IFNE RELERR
  710. RELERR SET 0
  711.   IFNC \0,CC
  712.    IFNC \0,VC
  713.     IFNC \0,CS
  714.      IFNC \0,VS
  715.      FAIL ** INVALID RELATIONAL OPERATOR -- \0 **
  716.      ENDC
  717.     ENDC
  718.    ENDC
  719.   ENDC
  720.  ENDC
  721.  ENDM
  722. REGTST MACR
  723. **********************************************************************
  724. *
  725. *    REGTST --
  726. *        THIS MACRO TESTS THE VALIDITY OF THE REGISTER
  727. *    NAME PASSED AS ITS FIRST ARGUMENT. IF THE NAME WAS NOT
  728. *    A VALID REGISTER, 'REGTST' WILL FAIL WITH AN ERROR MESSAGE.
  729. *
  730.  IFNC \0,A
  731.  IFNC \0,B
  732.  IFNC \0,D
  733.  IFNC \0,X
  734.  IFNC \0,Y
  735.  IFNC \0,U
  736.  IFNC \0,S
  737.  FAIL ** \0 IS NOT A 6809 REGISTER **
  738.  EXIT
  739.  ENDC
  740.  ENDC
  741.  ENDC
  742.  ENDC
  743.  ENDC
  744.  ENDC
  745.  ENDC
  746.  ENDM
  747. IF MACR
  748. **********************************************************************
  749. *
  750. *    IF --
  751. *        THE 'IF' MACRO WILL CAUSE THE STATEMENTS FOLLOWING
  752. *    IT TO BE EXECUTED UP TO THE FIRST 'ELSE' OR 'ENDIF' IF THE
  753. *    CONDITIONAL EXPRESSION IS TRUE. ITS SYNTAX IS:
  754. *
  755. *    IF    <REGISTER NAME>,<RELATIONAL OPERATOR>,<ADDRESS EXPRESSION>
  756. *
  757. *    THE VALID RELATIONAL OPERATORS ARE: 'EQ','NE','LE','LT',
  758. *    'GE', AND 'GT'.
  759. *
  760.  IFNE NARG-3
  761.   IFNC \3,L
  762.   FAIL ** 'IF' MACRO REQUIRES 3 ARGUMENTS **
  763.   ENDC
  764.  ENDC
  765.  IFC \3,L
  766. ISLONG SET 1
  767.  ENDC
  768.  REGTST \0
  769.  CMP\0 \2
  770.  RELOP \1
  771.  PUSH *-1-ISLONG
  772. ISLONG SET 0
  773.  ENDM
  774. ELSE MACR
  775. **********************************************************************
  776. *
  777. *    ELSE --
  778. *        THE 'ELSE' MACRO BEGINS THE STATEMENTS THAT WILL
  779. *    BE EXECUTED IF THE CONDITIONAL EXPRESSION OF THE PRECEDING
  780. *    'IF' MACRO WAS NOT TRUE.
  781. *
  782.  IFC \0,L
  783. ISLONG SET 1
  784.  ENDC
  785.  IFEQ ISLONG
  786.  BRA *
  787.  ENDC
  788.  IFEQ ISLONG-1
  789.  LBRA EXBUG
  790.  ENDC
  791. MCRTMP SET *
  792.  BACK1
  793.  IFEQ BCKLNG
  794.  IFGT (MCRTMP-*-1)-128
  795.  FAIL ** LONG 'IF' IS REQUIRED **
  796.  ENDC
  797.  FCB MCRTMP-*-1
  798.  ENDC
  799.  IFEQ BCKLNG-1
  800.  FDB MCRTMP-*-2
  801.  ENDC
  802.  ORG MCRTMP
  803.  POP
  804.  PUSH *-1-ISLONG
  805. ISLONG SET 0
  806.  ENDM
  807. ENDIF MACR
  808. **********************************************************************
  809. *
  810. *    ENDIF --
  811. *        THE 'ENDIF' MACRO IS THE TERMINATING STATEMENT FOR THE
  812. *    STATEMENTS CONTROLLED BY THE PRECEDING 'IF' OR 'ELSE' MACRO.
  813. *
  814. MCRTMP SET *
  815.  BACK1
  816.  IFEQ BCKLNG
  817.  IFGT (MCRTMP-*-1)-128
  818.  FAIL ** LONG 'ELSE' REQUIRED **
  819.  ENDC
  820.  FCB MCRTMP-*-1
  821.  ENDC
  822.  IFEQ BCKLNG-1
  823.  FDB MCRTMP-*-2
  824.  ENDC
  825.  ORG MCRTMP
  826.  POP
  827.  ENDM
  828. IFTST MACR
  829. **********************************************************************
  830. *
  831. *    IFTST --
  832. *        THE 'IFTST' MACRO OPERATES LIKE AN 'IF' MACRO EXCEPT
  833. *    THAT IT GENERATES A 'TST' INSTRUCTION INSTEAD OF A 'CMP'.
  834. *    THE SYNTAX IS:
  835. *
  836. *    IFTST    <REGISTER OR ADDRESS EXPRESSION>,<RELATIONAL OP>,0
  837. *
  838. *    THE VALID RELATIONAL OPERATORS FOR USE WITH 'IFTST' ARE: 'EQ',
  839. *    'NE', 'LT', AND 'GE'.
  840. *
  841.  IFC \3,L
  842. ISLONG SET 1
  843.  ENDC
  844.  IFC \2,L
  845. ISLONG SET 1
  846.  ENDC
  847.  IFC \0,A
  848.  TSTA
  849.  ENDC
  850.  IFC \0,B
  851.  TSTB
  852.  ENDC
  853.  IFNC \0,A
  854.   IFNC \0,B
  855.   TST \0
  856.   ENDC
  857.  ENDC
  858.  RELTST \1
  859.  PUSH *-1-ISLONG
  860. ISLONG SET 0
  861.  ENDM
  862. IFCC MACR
  863. **********************************************************************
  864. *
  865. *    IFCC --
  866. *        THE 'IFCC' MACRO FUNCTIONS LIKE AN 'IF' MACRO, EXCEPT
  867. *    IT ONLY GENERATES A 'BRANCH ON CONDITION' INSTRUCTION DIRECTLY.
  868. *    THIS IS USEFUL BECAUSE IT ALLOWS THE ASSEMBLER TO GENERATE THE
  869. *    LABEL FOR THE BRANCH INSTEAD OF FORCING THAT BURDEN ON THE
  870. *    OVER-WORKED PROGRAMMER. THE SYNTAX IS:
  871. *
  872. *    IFCC   <RELATIONAL OPERATOR>
  873. *
  874. *    THE VALID REALTIONAL OPERATORS ARE: 'EQ', 'NE', 'GE', 'GT',
  875. *    'LE', AND 'LT'.
  876. *
  877.  IFNE NARG-1
  878.   IFNC \1,L
  879.   FAIL ** ONLY ONE ARGUMENT (A RELATIONAL OPERATOR) ALLOWED **
  880.   ENDC
  881.  ENDC
  882.  IFC \1,L
  883. ISLONG SET 1
  884.  ENDC
  885.  RELCC \0
  886.  PUSH *-1-ISLONG
  887. ISLONG SET 0
  888.  ENDM
  889. WHILE MACR
  890. **********************************************************************
  891. *
  892. *    WHILE --
  893. *        THE 'WHILE' MACRO EXECUTES THE STATEMENTS FOLLOWING
  894. *    IT UP TO THE 'ENDWH' AS LONG AS ITS CONDITIONAL EXPRESSION IS
  895. *    TRUE. THE SNTAX IS:
  896. *
  897. *    WHILE <REGISTER NAME>,<RELATIONAL OPERATOR>,<ADDRESS EXPRESSION>
  898. *
  899.  IFNE NARG-3
  900.   IFNC \3,L
  901.   FAIL ** 'WHILE' REQUIRES 3 ARGUMENTS **
  902.   ENDC
  903.  ENDC
  904.  IFC \3,L
  905. ISLONG SET 1
  906.  ENDC
  907.  PUSH *
  908.  REGTST \0
  909.  CMP\0 \2
  910.  RELOP \1
  911.  PUSH *-1-ISLONG
  912. ISLONG SET 0
  913.  ENDM
  914. ENDWH MACR
  915. **********************************************************************
  916. *
  917. *    ENDWH --
  918. *        THIS MACRO TERMINATES THE STATEMENTS WITHIN A 'WHILE'
  919. *    LOOP.
  920. *
  921.  IFC \0,L
  922.   FAIL ** THE 'LONG' SHOULD BE PLACED ON THE 'WHILE' **
  923.  ENDC
  924. MCRTMP SET *
  925.  BACK1
  926.  IFEQ BCKLNG
  927.   IFGT -((MCRTMP+2)-*-1)-128
  928.   FAIL ** LONG 'WHILE' IS REQUIRED **
  929.   ENDC
  930.  FCB (MCRTMP+2)-*-1
  931.  ENDC
  932.  IFEQ BCKLNG-1
  933.  FDB (MCRTMP+3)-*-2
  934.  ENDC
  935.  POP
  936.  BACK1
  937. \.A EQU *
  938.  ORG MCRTMP
  939.  IFEQ BCKLNG
  940.  BRA \.A
  941.  ENDC
  942.  IFEQ BCKLNG-1
  943.  LBRA \.A
  944.  ENDC
  945.  POP
  946.  ENDM
  947. REPEAT MACR
  948. **********************************************************************
  949. *
  950. *    REPEAT --
  951. *        THE STATEMENTS BETWEEN A 'REPEAT' AND AN 'UNTIL' MACRO
  952. *    ARE REPEATED UNTIL THE CONDITIONAL EXPRESSION BECOMES TRUE.
  953. *
  954.  IFC \0,L
  955.   FAIL ** PLACE 'LONG' ON THE 'UNTIL' **
  956.  ENDC
  957.  PUSH *
  958.  ENDM
  959. UNTIL MACR
  960. **********************************************************************
  961. *
  962. *    UNTIL --
  963. *        THE 'UNTIL' MACRO TERMINATES A 'REPEAT' LOOP. IT HAS
  964. *    THE SYNTAX:
  965. *
  966. *    UNTIL  <REGISTER NAME>,<RELATIONAL OPERATOR>,<ADDRESS EXPRESSION>
  967. *
  968.  IFNE NARG-3
  969.   IFNC \3,L
  970.   FAIL ** 'UNTIL' REQUIRES 3 ARGUMENTS **
  971.   ENDC
  972.  ENDC
  973.  IFC \3,L
  974. ISLONG SET 1
  975.  ENDC
  976. MCRTMP SET *
  977.  BACK1
  978. \.A EQU *
  979.  ORG MCRTMP
  980.  POP
  981.  REGTST \0
  982.  CMP\0 \2
  983.  RELOP \1
  984.  ORG *-1-ISLONG
  985.  IFEQ ISLONG
  986.   IFGT -(\.A-*-1)-128
  987.   FAIL ** LONG 'UNTIL' IS REQUIRED **
  988.   ENDC
  989.   FCB \.A-*-1
  990.  ENDC
  991.  IFEQ ISLONG-1
  992.  FDB \.A-*-2
  993.  ENDC
  994. ISLONG SET 0
  995.  ENDM
  996. *
  997. *
  998. *
  999. *
  1000.  PAG
  1001. *
  1002. *
  1003. *
  1004. ************************************************
  1005. *
  1006. *   S H I F T    M A C R O S
  1007. *
  1008. ************************************************
  1009. *
  1010. *
  1011. *
  1012. *
  1013. RSHIFT MACR
  1014. *
  1015. *
  1016. *  THIS MACRO DOES A RIGHT SHIFT ON A MULTI-
  1017. * PRECISION OPERAND THAT IS UP TO 10 BYTES
  1018. * LONG, WHOSE MOST SIG. BYTE IS POINTED TO
  1019. * BY EITHER 0FF,X , OFF,Y , OR OFF,U; WHERE
  1020. * "OFF" IS A CONSTANT OFFSET SPECIFIED UPON
  1021. * INVOCATION OF THE MACRO. THE CARRY IS SHIFTED
  1022. * IN FROM THE RIGHT.
  1023. *
  1024. *
  1025. * TO INVOKE RSHIFT:
  1026. *
  1027. *     RSHIFT  <"OFF">,< X, Y OR U >,< BYTE LENGTH >
  1028. *
  1029. * CHECK FOR PROPER NO. OF ARGUMENTS
  1030. *
  1031.  IFNE  NARG-3
  1032.    FAIL  ** TO FEW OR TO MANY ARGUMENTS **
  1033.    EXIT
  1034.  ENDC
  1035. *
  1036. * CHECK FOR PROPER POINTER REG.( X , Y OR U )
  1037. *
  1038.  IFNC  \1,X
  1039.    IFNC  \1,Y
  1040.      IFNC  \1,U
  1041.        FAIL  ** \1 IS AN INVALID POINTER REG. **
  1042.        EXIT
  1043.      ENDC
  1044.    ENDC
  1045.  ENDC
  1046. *
  1047. * CHECK NO. OF BYTES ARGUMENT; MUST BE > 0
  1048. * AND <= 10.
  1049. *
  1050.  IFLE  \2
  1051.    FAIL  ** SHIFT BYTE COUNT MUST BE > 0 **
  1052.    EXIT
  1053.  ENDC
  1054. *
  1055.  IFGT  \2-10
  1056.    FAIL  ** SHIFT BYTE COUNT MUST BE <= 10 **
  1057.    EXIT
  1058.  ENDC
  1059. *
  1060. * START CODE GENERATION
  1061. *
  1062.  ROR  \0,\1
  1063.  IFGT  (\2)-1
  1064.    ROR    (\0)+1,\1
  1065.  ENDC
  1066.    IFGT  (\2)-2
  1067.      ROR  (\0)+2,\1
  1068.    ENDC
  1069.      IFGT  (\2)-3
  1070.        ROR  (\0)+3,\1
  1071.      ENDC
  1072.        IFGT  (\2)-4
  1073.      ROR  (\0)+4,\1
  1074.        ENDC
  1075.      IFGT  (\2)-5
  1076.        ROR    (\0)+5,\1
  1077.      ENDC
  1078.        IFGT  (\2)-6
  1079.          ROR  (\0)+6,\1
  1080.        ENDC
  1081.          IFGT  (\2)-7
  1082.            ROR  (\0)+7,\1
  1083.          ENDC
  1084.            IFGT  (\2)-8
  1085.          ROR  (\0)+8,\1
  1086.            ENDC
  1087.          IFGT  (\2)-9
  1088.            ROR    (\0)+9,\1
  1089.          ENDC
  1090. *
  1091. *
  1092.  ENDM
  1093. *
  1094. *
  1095. *
  1096.  PAG
  1097. *
  1098. *
  1099. *
  1100. *
  1101. *
  1102. LSHIFT MACR
  1103. *
  1104. *
  1105. *  THIS MACRO DOES A LEFT SHIFT ON A MULTI-
  1106. * PRECISION OPERAND THAT IS UP TO 10 BYTES
  1107. * LONG, WHOSE MOST SIG. BYTE IS POINTED TO
  1108. * BY EITHER 0FF,X , OFF,Y , OR OFF,U; WHERE
  1109. * "OFF" IS A CONSTANT OFFSET SPECIFIED UPON
  1110. * INVOCATION OF THE MACRO. THE CARRY IS SHIFTED
  1111. * IN FROM THE LEFT.
  1112. *
  1113. * TO INVOKE LSHIFT:
  1114. *
  1115. *     LSHIFT  <"0FF">,< X,Y OR U >,< BYTE LENGTH >
  1116. *
  1117. * CHECK FOR PROPER NO. OF ARGUMENTS
  1118. *
  1119.  IFNE  NARG-3
  1120.    FAIL  ** TO FEW OR TO MANY ARGUMENTS **
  1121.    EXIT
  1122.  ENDC
  1123. *
  1124. * CHECK FOR PROPER POINTER REG.( X OR Y )
  1125. *
  1126.  IFNC  \1,X
  1127.    IFNC  \1,Y
  1128.      IFNC  \1,U
  1129.        FAIL  ** \1 IS AN INVALID POINTER REG. **
  1130.        EXIT
  1131.      ENDC
  1132.    ENDC
  1133.  ENDC
  1134. *
  1135. * CHECK NO. OF BYTES ARGUMENT; MUST BE > 0
  1136. * AND <= 10.
  1137. *
  1138.  IFLE  \2
  1139.    FAIL  ** SHIFT BYTE COUNT MUST BE > 0 **
  1140.    EXIT
  1141.  ENDC
  1142. *
  1143.  IFGT  \2-10
  1144.    FAIL  ** SHIFT BYTE COUNT MUST BE <= 10 **
  1145.    EXIT
  1146.  ENDC
  1147. *
  1148. * START CODE GENERATION
  1149. *
  1150.  ROL  (\0)+(\2)-1,\1
  1151.  IFGT  (\2)-1
  1152.    ROL    (\0)+(\2)-2,\1
  1153.  ENDC
  1154.    IFGT  (\2)-2
  1155.      ROL  (\0)+(\2)-3,\1
  1156.    ENDC
  1157.      IFGT  (\2)-3
  1158.        ROL  (\0)+(\2)-4,\1
  1159.      ENDC
  1160.        IFGT  (\2)-4
  1161.      ROL  (\0)+(\2)-5,\1
  1162.        ENDC
  1163.      IFGT  (\2)-5
  1164.        ROL    (\0)+(\2)-6,\1
  1165.      ENDC
  1166.        IFGT  (\2)-6
  1167.          ROL  (\0)+(\2)-7,\1
  1168.        ENDC
  1169.          IFGT  (\2)-7
  1170.            ROL  (\0)+(\2)-8,\1
  1171.          ENDC
  1172.            IFGT  (\2)-8
  1173.          ROL  (\0)+(\2)-9,\1
  1174.            ENDC
  1175.          IFGT  (\2)-9
  1176.            ROL    (\0)+(\2)-10,\1
  1177.          ENDC
  1178. *
  1179. *
  1180.  ENDM
  1181. *
  1182. *
  1183.  PAG
  1184. *
  1185. *
  1186. *
  1187. *************************************************
  1188. *
  1189. *    XPLUSY --
  1190. *
  1191. *     THIS MACRO EFFICIENTLY ADDS THE 9-BYTE
  1192. *    FRACTION POINTED TO BY XREG TO THAT POINTED
  1193. *    TO BY YREG, LEAVING THE RESULT IN FRACTION
  1194. *    POINTED TO BY XREG.  CARRY OUT OF HIGH-ORDER
  1195. *    BIT IS IN CARRY FLAG.
  1196. *
  1197. XPLUSY    MACR
  1198.   LDD  7,X
  1199.   ADDD    7,Y
  1200.   STD  7,X
  1201.   LDD  5,X
  1202.   ADCD    (5,Y)
  1203.   STD  5,X
  1204.   LDD  3,X
  1205.   ADCD    (3,Y)
  1206.   STD  3,X
  1207.   LDD  1,X
  1208.   ADCD    (1,Y)
  1209.   STD  1,X
  1210.   LDB  0,X
  1211.   ADCB 0,Y
  1212.   STB  0,X
  1213.   ENDM
  1214. *
  1215. *************************************************
  1216. *
  1217. *    XSBTRY --
  1218. *
  1219. *     MACRO TO SUBTRACT 9-BYTE FRACTION POINTED
  1220. *    TO BY Y-REG FROM THAT AT X-REG, RESULT STORED
  1221. *    X-REG.  IT IS EFFICIENT.
  1222. *
  1223. XSBTRY MACR
  1224.   LDD  7,X
  1225.   SUBD    7,Y
  1226.   STD  7,X
  1227.   LDD  5,X
  1228.   SBCD    (5,Y)
  1229.   STD  5,X
  1230.   LDD  3,X
  1231.   SBCD    (3,Y)
  1232.   STD  3,X
  1233.   LDD  1,X
  1234.   SBCD    (1,Y)
  1235.   STD  1,X
  1236.   LDB  0,X
  1237.   SBCB 0,Y
  1238.   STB  0,X
  1239.   ENDM
  1240. *
  1241. ************************************************************
  1242. *
  1243. *  ADCD
  1244. *
  1245. *      ADCD SIMULATES WHAT WOULD BE THE ACTION OF A
  1246. *  ADDD W/ CARRY INSTRUCTION IF IT EXISTED, ALAS IT
  1247. *  DOESN'T SO IT IS DONE USING THE ADCA & ADCB INSTRUCTIONS
  1248. *
  1249. *  TO INVOKE ADCD: ADCD  <ADD. MODE>
  1250. *  NOTE: MUST ONLY USE CONSTANT OFFSETS
  1251. *
  1252. ADCD  MACR
  1253. *
  1254.   ADCB    1+\0
  1255.   ADCA    \0
  1256. *
  1257.  ENDM
  1258. *
  1259. ************************************************************
  1260. *
  1261. *  SBCD
  1262. *
  1263. *      SBCD SIMULATES WHAT WOULD BE THE ACTION OF A
  1264. *  SUBD W/ CARRY INSTRUCTION IF IT EXISTED, ALAS IT
  1265. *  DOESN'T SO IT IS DONE USING THE SBCA & SBCB INSTRUCTIONS
  1266. *
  1267. *  TO INVOKE SBCD:  SBCD  <ADD. MODE>
  1268. *  NOTE: MUST ONLY USE CONSTANT OFFSETS
  1269. *
  1270. SBCD  MACR
  1271. *
  1272.   SBCB    1+\0
  1273.   SBCA    \0
  1274. *
  1275.  ENDM
  1276. *
  1277. *
  1278.